{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "_cell_guid": "4d5be342-abe9-4c95-98fd-c904762ecca9",
    "_uuid": "47570c242f4774c5d670093b822cf6a3f3a91ba9"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.feature_extraction import DictVectorizer\n",
    "\n",
    "import tensorflow as tf\n",
    "\n",
    "from keras import layers\n",
    "from keras.preprocessing.sequence import pad_sequences\n",
    "from keras import initializers, regularizers, constraints\n",
    "from keras import backend as K\n",
    "from keras.models import Model, Sequential, Input\n",
    "import keras\n",
    "\n",
    "from keras_contrib.layers import CRF\n",
    "from keras_contrib.losses import crf_loss\n",
    "from keras_contrib.metrics import crf_accuracy\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "gpus = tf.config.experimental.list_physical_devices(device_type='GPU')\n",
    "for gpu in gpus:\n",
    "    tf.config.experimental.set_memory_growth(gpu, True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "source = pd.read_table('../archive/source_BIO_2014_cropus.txt', header=None, nrows=1e4)\n",
    "target = pd.read_table('../archive/target_BIO_2014_cropus.txt', header=None, nrows=1e4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "WORD_NUM = 100"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "x = source[0].tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "y = target[0].tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = [i.split(' ') for i in x]\n",
    "y = [i.split(' ') for i in y]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[['人',\n",
       "  '民',\n",
       "  '网',\n",
       "  '1',\n",
       "  '月',\n",
       "  '1',\n",
       "  '日',\n",
       "  '讯',\n",
       "  '据',\n",
       "  '《',\n",
       "  '纽',\n",
       "  '约',\n",
       "  '时',\n",
       "  '报',\n",
       "  '》',\n",
       "  '报',\n",
       "  '道',\n",
       "  ',',\n",
       "  '美',\n",
       "  '国',\n",
       "  '华',\n",
       "  '尔',\n",
       "  '街',\n",
       "  '股',\n",
       "  '市',\n",
       "  '在',\n",
       "  '2',\n",
       "  '0',\n",
       "  '1',\n",
       "  '3',\n",
       "  '年',\n",
       "  '的',\n",
       "  '最',\n",
       "  '后',\n",
       "  '一',\n",
       "  '天',\n",
       "  '继',\n",
       "  '续',\n",
       "  '上',\n",
       "  '涨',\n",
       "  ',',\n",
       "  '和',\n",
       "  '全',\n",
       "  '球',\n",
       "  '股',\n",
       "  '市',\n",
       "  '一',\n",
       "  '样',\n",
       "  ',',\n",
       "  '都',\n",
       "  '以',\n",
       "  '最',\n",
       "  '高',\n",
       "  '纪',\n",
       "  '录',\n",
       "  '或',\n",
       "  '接',\n",
       "  '近',\n",
       "  '最',\n",
       "  '高',\n",
       "  '纪',\n",
       "  '录',\n",
       "  '结',\n",
       "  '束',\n",
       "  '本',\n",
       "  '年',\n",
       "  '的',\n",
       "  '交',\n",
       "  '易',\n",
       "  '。']]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x[:1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[['O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'B_T',\n",
       "  'I_T',\n",
       "  'I_T',\n",
       "  'I_T',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'B_LOC',\n",
       "  'I_LOC',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'B_LOC',\n",
       "  'I_LOC',\n",
       "  'I_LOC',\n",
       "  'I_LOC',\n",
       "  'I_LOC',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'B_T',\n",
       "  'I_T',\n",
       "  'I_T',\n",
       "  'I_T',\n",
       "  'I_T',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O',\n",
       "  'O']]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y[:1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[70,\n",
       " 84,\n",
       " 90,\n",
       " 133,\n",
       " 140,\n",
       " 119,\n",
       " 180,\n",
       " 119,\n",
       " 210,\n",
       " 170,\n",
       " 100,\n",
       " 79,\n",
       " 57,\n",
       " 94,\n",
       " 87,\n",
       " 48,\n",
       " 74,\n",
       " 63,\n",
       " 133,\n",
       " 14,\n",
       " 38,\n",
       " 55,\n",
       " 100,\n",
       " 69,\n",
       " 76,\n",
       " 79,\n",
       " 12,\n",
       " 87,\n",
       " 22,\n",
       " 64,\n",
       " 157,\n",
       " 82,\n",
       " 11,\n",
       " 175,\n",
       " 93,\n",
       " 100,\n",
       " 51,\n",
       " 133,\n",
       " 197,\n",
       " 285,\n",
       " 244,\n",
       " 74,\n",
       " 56,\n",
       " 17,\n",
       " 77,\n",
       " 27,\n",
       " 81,\n",
       " 24,\n",
       " 28,\n",
       " 50,\n",
       " 31,\n",
       " 37,\n",
       " 23,\n",
       " 47,\n",
       " 29,\n",
       " 52,\n",
       " 10,\n",
       " 36,\n",
       " 39,\n",
       " 57,\n",
       " 29,\n",
       " 45,\n",
       " 30,\n",
       " 5,\n",
       " 161,\n",
       " 17,\n",
       " 77,\n",
       " 121,\n",
       " 126,\n",
       " 122,\n",
       " 136,\n",
       " 15,\n",
       " 111,\n",
       " 123,\n",
       " 68,\n",
       " 114,\n",
       " 178,\n",
       " 154,\n",
       " 16,\n",
       " 122,\n",
       " 153,\n",
       " 117,\n",
       " 14,\n",
       " 103,\n",
       " 121,\n",
       " 58,\n",
       " 128,\n",
       " 17,\n",
       " 98,\n",
       " 141,\n",
       " 121,\n",
       " 85,\n",
       " 35,\n",
       " 100,\n",
       " 133,\n",
       " 151,\n",
       " 135,\n",
       " 17,\n",
       " 158,\n",
       " 88,\n",
       " 15,\n",
       " 11,\n",
       " 22,\n",
       " 231,\n",
       " 351,\n",
       " 227,\n",
       " 545,\n",
       " 43,\n",
       " 10,\n",
       " 23,\n",
       " 59,\n",
       " 158,\n",
       " 172,\n",
       " 314,\n",
       " 256,\n",
       " 355,\n",
       " 30,\n",
       " 177,\n",
       " 171,\n",
       " 80,\n",
       " 128,\n",
       " 132,\n",
       " 147,\n",
       " 184,\n",
       " 197,\n",
       " 519,\n",
       " 616,\n",
       " 204,\n",
       " 85,\n",
       " 77,\n",
       " 135,\n",
       " 63,\n",
       " 180,\n",
       " 134,\n",
       " 84,\n",
       " 148,\n",
       " 90,\n",
       " 141,\n",
       " 48,\n",
       " 85,\n",
       " 118,\n",
       " 133,\n",
       " 96,\n",
       " 57,\n",
       " 84,\n",
       " 142,\n",
       " 62,\n",
       " 112,\n",
       " 146,\n",
       " 220,\n",
       " 313,\n",
       " 149,\n",
       " 262,\n",
       " 285,\n",
       " 95,\n",
       " 13,\n",
       " 73,\n",
       " 113,\n",
       " 13,\n",
       " 37,\n",
       " 86,\n",
       " 47,\n",
       " 61,\n",
       " 96,\n",
       " 15,\n",
       " 54,\n",
       " 77,\n",
       " 47,\n",
       " 79,\n",
       " 14,\n",
       " 66,\n",
       " 41,\n",
       " 42,\n",
       " 142,\n",
       " 39,\n",
       " 7,\n",
       " 138,\n",
       " 8,\n",
       " 46,\n",
       " 92,\n",
       " 9,\n",
       " 80,\n",
       " 56,\n",
       " 11,\n",
       " 139,\n",
       " 8,\n",
       " 33,\n",
       " 70,\n",
       " 6,\n",
       " 213,\n",
       " 229,\n",
       " 130,\n",
       " 161,\n",
       " 152,\n",
       " 109,\n",
       " 40,\n",
       " 79,\n",
       " 160,\n",
       " 141,\n",
       " 157,\n",
       " 80,\n",
       " 154,\n",
       " 164,\n",
       " 87,\n",
       " 143,\n",
       " 27,\n",
       " 10,\n",
       " 126,\n",
       " 74,\n",
       " 136,\n",
       " 76,\n",
       " 175,\n",
       " 73,\n",
       " 79,\n",
       " 124,\n",
       " 241,\n",
       " 116,\n",
       " 155,\n",
       " 26,\n",
       " 139,\n",
       " 109,\n",
       " 154,\n",
       " 174,\n",
       " 191,\n",
       " 221,\n",
       " 195,\n",
       " 306,\n",
       " 119,\n",
       " 78,\n",
       " 74,\n",
       " 8,\n",
       " 84,\n",
       " 102,\n",
       " 15,\n",
       " 38,\n",
       " 126,\n",
       " 42,\n",
       " 14,\n",
       " 57,\n",
       " 54,\n",
       " 83,\n",
       " 104,\n",
       " 8,\n",
       " 78,\n",
       " 120,\n",
       " 207,\n",
       " 243,\n",
       " 35,\n",
       " 69,\n",
       " 118,\n",
       " 103,\n",
       " 121,\n",
       " 66,\n",
       " 69,\n",
       " 59,\n",
       " 95,\n",
       " 54,\n",
       " 12,\n",
       " 81,\n",
       " 67,\n",
       " 151,\n",
       " 177,\n",
       " 182,\n",
       " 16,\n",
       " 62,\n",
       " 141,\n",
       " 144,\n",
       " 160,\n",
       " 24,\n",
       " 14,\n",
       " 157,\n",
       " 144,\n",
       " 5,\n",
       " 16,\n",
       " 133,\n",
       " 94,\n",
       " 142,\n",
       " 33,\n",
       " 22,\n",
       " 12,\n",
       " 11,\n",
       " 23,\n",
       " 28,\n",
       " 56,\n",
       " 121,\n",
       " 133,\n",
       " 81,\n",
       " 60,\n",
       " 128,\n",
       " 140,\n",
       " 104,\n",
       " 5,\n",
       " 16,\n",
       " 165,\n",
       " 12,\n",
       " 146,\n",
       " 217,\n",
       " 143,\n",
       " 188,\n",
       " 109,\n",
       " 187,\n",
       " 45,\n",
       " 65,\n",
       " 148,\n",
       " 96,\n",
       " 326,\n",
       " 4,\n",
       " 104,\n",
       " 11,\n",
       " 118,\n",
       " 84,\n",
       " 91,\n",
       " 105,\n",
       " 96,\n",
       " 31,\n",
       " 13,\n",
       " 87,\n",
       " 45,\n",
       " 92,\n",
       " 76,\n",
       " 107,\n",
       " 115,\n",
       " 112,\n",
       " 116,\n",
       " 147,\n",
       " 90,\n",
       " 62,\n",
       " 158,\n",
       " 61,\n",
       " 182,\n",
       " 133,\n",
       " 10,\n",
       " 9,\n",
       " 117,\n",
       " 186,\n",
       " 80,\n",
       " 13,\n",
       " 73,\n",
       " 113,\n",
       " 13,\n",
       " 37,\n",
       " 86,\n",
       " 47,\n",
       " 61,\n",
       " 96,\n",
       " 15,\n",
       " 54,\n",
       " 77,\n",
       " 47,\n",
       " 79,\n",
       " 14,\n",
       " 66,\n",
       " 41,\n",
       " 42,\n",
       " 146,\n",
       " 117,\n",
       " 77,\n",
       " 89,\n",
       " 94,\n",
       " 68,\n",
       " 122,\n",
       " 134,\n",
       " 172,\n",
       " 83,\n",
       " 21,\n",
       " 119,\n",
       " 82,\n",
       " 132,\n",
       " 22,\n",
       " 24,\n",
       " 32,\n",
       " 43,\n",
       " 54,\n",
       " 69,\n",
       " 128,\n",
       " 13,\n",
       " 74,\n",
       " 51,\n",
       " 129,\n",
       " 123,\n",
       " 75,\n",
       " 167,\n",
       " 115,\n",
       " 188,\n",
       " 28,\n",
       " 98,\n",
       " 18,\n",
       " 69,\n",
       " 110,\n",
       " 19,\n",
       " 80,\n",
       " 88,\n",
       " 40,\n",
       " 27,\n",
       " 76,\n",
       " 160,\n",
       " 124,\n",
       " 308,\n",
       " 208,\n",
       " 175,\n",
       " 25,\n",
       " 252,\n",
       " 9,\n",
       " 156,\n",
       " 148,\n",
       " 146,\n",
       " 178,\n",
       " 194,\n",
       " 20,\n",
       " 185,\n",
       " 10,\n",
       " 124,\n",
       " 13,\n",
       " 10,\n",
       " 16,\n",
       " 95,\n",
       " 32,\n",
       " 11,\n",
       " 10,\n",
       " 14,\n",
       " 113,\n",
       " 34,\n",
       " 14,\n",
       " 29,\n",
       " 129,\n",
       " 197,\n",
       " 52,\n",
       " 29,\n",
       " 111,\n",
       " 29,\n",
       " 116,\n",
       " 42,\n",
       " 13,\n",
       " 29,\n",
       " 107,\n",
       " 95,\n",
       " 11,\n",
       " 118,\n",
       " 44,\n",
       " 12,\n",
       " 47,\n",
       " 68,\n",
       " 47,\n",
       " 13,\n",
       " 3,\n",
       " 170,\n",
       " 3,\n",
       " 219,\n",
       " 3,\n",
       " 138,\n",
       " 173,\n",
       " 106,\n",
       " 77,\n",
       " 183,\n",
       " 12,\n",
       " 162,\n",
       " 18,\n",
       " 88,\n",
       " 132,\n",
       " 35,\n",
       " 35,\n",
       " 44,\n",
       " 37,\n",
       " 157,\n",
       " 17,\n",
       " 45,\n",
       " 16,\n",
       " 33,\n",
       " 130,\n",
       " 114,\n",
       " 335,\n",
       " 27,\n",
       " 31,\n",
       " 21,\n",
       " 14,\n",
       " 14,\n",
       " 7,\n",
       " 36,\n",
       " 201,\n",
       " 36,\n",
       " 102,\n",
       " 156,\n",
       " 27,\n",
       " 523,\n",
       " 194,\n",
       " 108,\n",
       " 90,\n",
       " 52,\n",
       " 169,\n",
       " 3,\n",
       " 8,\n",
       " 154,\n",
       " 79,\n",
       " 74,\n",
       " 132,\n",
       " 121,\n",
       " 83,\n",
       " 118,\n",
       " 110,\n",
       " 10,\n",
       " 122,\n",
       " 127,\n",
       " 158,\n",
       " 148,\n",
       " 10,\n",
       " 137,\n",
       " 141,\n",
       " 145,\n",
       " 129,\n",
       " 156,\n",
       " 76,\n",
       " 117,\n",
       " 402,\n",
       " 282,\n",
       " 288,\n",
       " 8,\n",
       " 107,\n",
       " 48,\n",
       " 150,\n",
       " 84,\n",
       " 90,\n",
       " 25,\n",
       " 29,\n",
       " 89,\n",
       " 215,\n",
       " 88,\n",
       " 63,\n",
       " 47,\n",
       " 98,\n",
       " 15,\n",
       " 109,\n",
       " 240,\n",
       " 15,\n",
       " 90,\n",
       " 116,\n",
       " 103,\n",
       " 95,\n",
       " 158,\n",
       " 61,\n",
       " 145,\n",
       " 94,\n",
       " 203,\n",
       " 99,\n",
       " 49,\n",
       " 56,\n",
       " 121,\n",
       " 133,\n",
       " 81,\n",
       " 60,\n",
       " 128,\n",
       " 140,\n",
       " 104,\n",
       " 16,\n",
       " 108,\n",
       " 57,\n",
       " 20,\n",
       " 100,\n",
       " 55,\n",
       " 195,\n",
       " 60,\n",
       " 289,\n",
       " 199,\n",
       " 57,\n",
       " 88,\n",
       " 131,\n",
       " 92,\n",
       " 133,\n",
       " 82,\n",
       " 124,\n",
       " 98,\n",
       " 46,\n",
       " 74,\n",
       " 113,\n",
       " 70,\n",
       " 44,\n",
       " 130,\n",
       " 129,\n",
       " 144,\n",
       " 5,\n",
       " 16,\n",
       " 133,\n",
       " 94,\n",
       " 142,\n",
       " 5,\n",
       " 15,\n",
       " 178,\n",
       " 99,\n",
       " 5,\n",
       " 15,\n",
       " 87,\n",
       " 138,\n",
       " 74,\n",
       " 20,\n",
       " 112,\n",
       " 115,\n",
       " 123,\n",
       " 128,\n",
       " 53,\n",
       " 2,\n",
       " 17,\n",
       " 252,\n",
       " 62,\n",
       " 163,\n",
       " 148,\n",
       " 55,\n",
       " 10,\n",
       " 126,\n",
       " 5,\n",
       " 104,\n",
       " 98,\n",
       " 5,\n",
       " 121,\n",
       " 82,\n",
       " 56,\n",
       " 5,\n",
       " 214,\n",
       " 94,\n",
       " 62,\n",
       " 58,\n",
       " 50,\n",
       " 90,\n",
       " 57,\n",
       " 48,\n",
       " 58,\n",
       " 111,\n",
       " 43,\n",
       " 62,\n",
       " 69,\n",
       " 12,\n",
       " 94,\n",
       " 35,\n",
       " 41,\n",
       " 100,\n",
       " 13,\n",
       " 75,\n",
       " 115,\n",
       " 44,\n",
       " 89,\n",
       " 3,\n",
       " 25,\n",
       " 10,\n",
       " 12,\n",
       " 46,\n",
       " 67,\n",
       " 55,\n",
       " 56,\n",
       " 43,\n",
       " 68,\n",
       " 3,\n",
       " 13,\n",
       " 33,\n",
       " 73,\n",
       " 128,\n",
       " 54,\n",
       " 62,\n",
       " 108,\n",
       " 22,\n",
       " 53,\n",
       " 3,\n",
       " 5,\n",
       " 11,\n",
       " 57,\n",
       " 118,\n",
       " 40,\n",
       " 5,\n",
       " 10,\n",
       " 67,\n",
       " 95,\n",
       " 44,\n",
       " 55,\n",
       " 9,\n",
       " 20,\n",
       " 12,\n",
       " 140,\n",
       " 44,\n",
       " 93,\n",
       " 104,\n",
       " 88,\n",
       " 3,\n",
       " 10,\n",
       " 91,\n",
       " 179,\n",
       " 3,\n",
       " 11,\n",
       " 13,\n",
       " 184,\n",
       " 17,\n",
       " 141,\n",
       " 16,\n",
       " 110,\n",
       " 40,\n",
       " 25,\n",
       " 11,\n",
       " 72,\n",
       " 52,\n",
       " 63,\n",
       " 52,\n",
       " 38,\n",
       " 42,\n",
       " 10,\n",
       " 27,\n",
       " 39,\n",
       " 124,\n",
       " 122,\n",
       " 132,\n",
       " 218,\n",
       " 120,\n",
       " 92,\n",
       " 102,\n",
       " 66,\n",
       " 136,\n",
       " 9,\n",
       " 150,\n",
       " 229,\n",
       " 10,\n",
       " 273,\n",
       " 62,\n",
       " 150,\n",
       " 9,\n",
       " 121,\n",
       " 147,\n",
       " 137,\n",
       " 70,\n",
       " 10,\n",
       " 51,\n",
       " 145,\n",
       " 118,\n",
       " 50,\n",
       " 9,\n",
       " 100,\n",
       " 39,\n",
       " 45,\n",
       " 5,\n",
       " 12,\n",
       " 16,\n",
       " 55,\n",
       " 107,\n",
       " 64,\n",
       " 101,\n",
       " 2,\n",
       " 87,\n",
       " 145,\n",
       " 5,\n",
       " 10,\n",
       " 92,\n",
       " 210,\n",
       " 143,\n",
       " 5,\n",
       " 10,\n",
       " 217,\n",
       " 132,\n",
       " 96,\n",
       " 318,\n",
       " 52,\n",
       " 66,\n",
       " 155,\n",
       " 327,\n",
       " 286,\n",
       " 319,\n",
       " 77,\n",
       " 112,\n",
       " 184,\n",
       " 242,\n",
       " 65,\n",
       " 137,\n",
       " 417,\n",
       " 513,\n",
       " 143,\n",
       " 10,\n",
       " 11,\n",
       " 17,\n",
       " 121,\n",
       " 79,\n",
       " 162,\n",
       " 194,\n",
       " 80,\n",
       " 108,\n",
       " 97,\n",
       " 156,\n",
       " 149,\n",
       " 21,\n",
       " 23,\n",
       " 106,\n",
       " 244,\n",
       " 85,\n",
       " 167,\n",
       " 193,\n",
       " 93,\n",
       " 123,\n",
       " 119,\n",
       " 115,\n",
       " 187,\n",
       " 156,\n",
       " 121,\n",
       " 87,\n",
       " 123,\n",
       " 56,\n",
       " 123,\n",
       " 101,\n",
       " 119,\n",
       " 80,\n",
       " 108,\n",
       " 36,\n",
       " 77,\n",
       " 115,\n",
       " 125,\n",
       " 28,\n",
       " 14,\n",
       " 68,\n",
       " 171,\n",
       " 108,\n",
       " 269,\n",
       " 186,\n",
       " 145,\n",
       " 202,\n",
       " 186,\n",
       " 266,\n",
       " 120,\n",
       " 36,\n",
       " 100,\n",
       " 133,\n",
       " 151,\n",
       " 135,\n",
       " 17,\n",
       " 158,\n",
       " 88,\n",
       " 8,\n",
       " 34,\n",
       " 110,\n",
       " 118,\n",
       " 18,\n",
       " 72,\n",
       " 54,\n",
       " 82,\n",
       " 135,\n",
       " 60,\n",
       " 84,\n",
       " 118,\n",
       " 96,\n",
       " 51,\n",
       " 58,\n",
       " 86,\n",
       " 42,\n",
       " 160,\n",
       " 119,\n",
       " 101,\n",
       " 83,\n",
       " 117,\n",
       " 78,\n",
       " 119,\n",
       " 154,\n",
       " 134,\n",
       " 100,\n",
       " 136,\n",
       " 99,\n",
       " 104,\n",
       " 69,\n",
       " 142,\n",
       " 144,\n",
       " 89,\n",
       " 83,\n",
       " 115,\n",
       " 76,\n",
       " 112,\n",
       " 135,\n",
       " 101,\n",
       " 122,\n",
       " 57,\n",
       " 78,\n",
       " 205,\n",
       " 83,\n",
       " 79,\n",
       " 75,\n",
       " 112,\n",
       " 28,\n",
       " 38,\n",
       " 46,\n",
       " 77,\n",
       " 50,\n",
       " 91,\n",
       " 77,\n",
       " 22,\n",
       " 102,\n",
       " 114,\n",
       " 86,\n",
       " 82,\n",
       " 34,\n",
       " 13,\n",
       " 13,\n",
       " 44,\n",
       " 131,\n",
       " 159,\n",
       " 59,\n",
       " 145,\n",
       " 46,\n",
       " 129,\n",
       " 88,\n",
       " 111,\n",
       " 84,\n",
       " 71,\n",
       " 98,\n",
       " 63,\n",
       " 108,\n",
       " 57,\n",
       " 69,\n",
       " 48,\n",
       " 67,\n",
       " 23,\n",
       " 93,\n",
       " 48,\n",
       " 9,\n",
       " 123,\n",
       " 91,\n",
       " 116,\n",
       " 76,\n",
       " 138,\n",
       " 126,\n",
       " 108,\n",
       " 160,\n",
       " 165,\n",
       " 75,\n",
       " 61,\n",
       " 89,\n",
       " 115,\n",
       " 19,\n",
       " 81,\n",
       " 162,\n",
       " 215,\n",
       " 166,\n",
       " 237,\n",
       " 302,\n",
       " 104,\n",
       " 255,\n",
       " 17,\n",
       " 61,\n",
       " 228,\n",
       " 330,\n",
       " 259,\n",
       " 242,\n",
       " 19,\n",
       " 55,\n",
       " 297,\n",
       " 369,\n",
       " 100,\n",
       " 162,\n",
       " 160,\n",
       " 149,\n",
       " 162,\n",
       " 168,\n",
       " 137,\n",
       " 200,\n",
       " 258,\n",
       " 69,\n",
       " 137,\n",
       " 61,\n",
       " 37,\n",
       " 12,\n",
       " 53,\n",
       " 164,\n",
       " 105,\n",
       " 67,\n",
       " 179,\n",
       " 10,\n",
       " 61,\n",
       " 143,\n",
       " 144,\n",
       " 71,\n",
       " 169,\n",
       " 12,\n",
       " 116,\n",
       " 62,\n",
       " 158,\n",
       " 90,\n",
       " 101,\n",
       " 270,\n",
       " 23,\n",
       " 75,\n",
       " 198,\n",
       " 205,\n",
       " 280,\n",
       " 25,\n",
       " 47,\n",
       " 190,\n",
       " 222,\n",
       " 308,\n",
       " 25,\n",
       " 71,\n",
       " 215,\n",
       " 201,\n",
       " 242,\n",
       " 59,\n",
       " 59,\n",
       " 108,\n",
       " 99,\n",
       " 142,\n",
       " 59,\n",
       " 92,\n",
       " 25,\n",
       " 59,\n",
       " 65,\n",
       " ...]"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_length = [len(i) for i in x]\n",
    "x_length"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10    166\n",
       "12    142\n",
       "9     130\n",
       "11    127\n",
       "14    123\n",
       "13    116\n",
       "8     111\n",
       "7     111\n",
       "5     110\n",
       "20    103\n",
       "Name: 0, dtype: int64"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame(x_length)[0].value_counts()[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "# %%time\n",
    "# x_x = []\n",
    "# y_y = []\n",
    "# for m, n in enumerate(x):\n",
    "#     if len(n) >= WORD_NUM or len(n) >= WORD_NUM / 2:\n",
    "#         x_x.append(n)\n",
    "#         y_y.append(y[m])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "# x = x_x\n",
    "# y = y_y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "def create(i):\n",
    "    global num\n",
    "    temp = []\n",
    "    \n",
    "    for g in i:\n",
    "        try:\n",
    "            corpus[g]\n",
    "            temp.append(corpus[g])\n",
    "        except:\n",
    "            corpus[g] = num\n",
    "            temp.append(corpus[g])\n",
    "            num += 1\n",
    "    return temp"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "corpus = {}\n",
    "corpus['<PAD>'] = 0\n",
    "corpus['<UNK>'] = 1\n",
    "\n",
    "num = 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "text = []\n",
    "for i in x:\n",
    "    temp = create(i)\n",
    "    text.append(temp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[[2,\n",
       "  3,\n",
       "  4,\n",
       "  5,\n",
       "  6,\n",
       "  5,\n",
       "  7,\n",
       "  8,\n",
       "  9,\n",
       "  10,\n",
       "  11,\n",
       "  12,\n",
       "  13,\n",
       "  14,\n",
       "  15,\n",
       "  14,\n",
       "  16,\n",
       "  17,\n",
       "  18,\n",
       "  19,\n",
       "  20,\n",
       "  21,\n",
       "  22,\n",
       "  23,\n",
       "  24,\n",
       "  25,\n",
       "  26,\n",
       "  27,\n",
       "  5,\n",
       "  28,\n",
       "  29,\n",
       "  30,\n",
       "  31,\n",
       "  32,\n",
       "  33,\n",
       "  34,\n",
       "  35,\n",
       "  36,\n",
       "  37,\n",
       "  38,\n",
       "  17,\n",
       "  39,\n",
       "  40,\n",
       "  41,\n",
       "  23,\n",
       "  24,\n",
       "  33,\n",
       "  42,\n",
       "  17,\n",
       "  43,\n",
       "  44,\n",
       "  31,\n",
       "  45,\n",
       "  46,\n",
       "  47,\n",
       "  48,\n",
       "  49,\n",
       "  50,\n",
       "  31,\n",
       "  45,\n",
       "  46,\n",
       "  47,\n",
       "  51,\n",
       "  52,\n",
       "  53,\n",
       "  29,\n",
       "  30,\n",
       "  54,\n",
       "  55,\n",
       "  56]]"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "text[:1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "text = pad_sequences(text, maxlen=WORD_NUM, padding='post', value=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "label = []\n",
    "for i in y:\n",
    "    label += i"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "targ = dict(zip(set(label), range(9)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'B_ORG': 0,\n",
       " 'I_PER': 1,\n",
       " 'I_LOC': 2,\n",
       " 'B_T': 3,\n",
       " 'I_ORG': 4,\n",
       " 'B_PER': 5,\n",
       " 'I_T': 6,\n",
       " 'O': 7,\n",
       " 'B_LOC': 8}"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "targ"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "def create_label(i):\n",
    "    temp = []\n",
    "    \n",
    "    for g in i:\n",
    "        temp.append(targ[g])\n",
    "    return temp"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "label = []\n",
    "for i in y:\n",
    "    temp = create_label(i)\n",
    "    label.append(temp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[[7,\n",
       "  7,\n",
       "  7,\n",
       "  3,\n",
       "  6,\n",
       "  6,\n",
       "  6,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  8,\n",
       "  2,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  8,\n",
       "  2,\n",
       "  2,\n",
       "  2,\n",
       "  2,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  3,\n",
       "  6,\n",
       "  6,\n",
       "  6,\n",
       "  6,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7,\n",
       "  7]]"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "label[:1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "label = pad_sequences(label, maxlen=WORD_NUM, padding='post', value=targ['O'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(10000, 100)"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "label.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{0: '0'},\n",
       " {1: '1'},\n",
       " {2: '2'},\n",
       " {3: '3'},\n",
       " {4: '4'},\n",
       " {5: '5'},\n",
       " {6: '6'},\n",
       " {7: '7'},\n",
       " {8: '8'}]"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dv_targ = [{i: str(i)} for i in range(9)]\n",
    "dv_targ"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DictVectorizer(sparse=False)"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dv = DictVectorizer(sparse=False)\n",
    "dv.fit(dv_targ)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['0=0', '1=1', '2=2', '3=3', '4=4', '5=5', '6=6', '7=7', '8=8']"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dv.feature_names_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "label = label.astype(str)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([['7', '7', '7', ..., '7', '7', '7'],\n",
       "       ['7', '8', '2', ..., '7', '7', '7'],\n",
       "       ['7', '3', '6', ..., '7', '7', '7'],\n",
       "       ...,\n",
       "       ['7', '7', '7', ..., '7', '7', '7'],\n",
       "       ['7', '7', '7', ..., '7', '7', '7'],\n",
       "       ['7', '7', '7', ..., '1', '1', '7']], dtype='<U11')"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "label"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Wall time: 1min 6s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "l = []\n",
    "for i in range(label.shape[0]):\n",
    "    temp = []\n",
    "    for g in range(label.shape[1]):\n",
    "        t = dv.transform({\n",
    "            eval(label[i, g]): label[i, g]\n",
    "        })\n",
    "        temp.append(t[0].tolist())\n",
    "    l.append(temp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "label = np.array(l)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(10000, 100, 9)"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "label.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Attention(layers.Layer):\n",
    "    def __init__(self, step_dim,\n",
    "                 W_regularizer=None, b_regularizer=None,\n",
    "                 W_constraint=None, b_constraint=None,\n",
    "                 bias=True, **kwargs):\n",
    "        self.supports_masking = True\n",
    "        self.init = initializers.get('glorot_uniform')\n",
    "\n",
    "        self.W_regularizer = regularizers.get(W_regularizer)\n",
    "        self.b_regularizer = regularizers.get(b_regularizer)\n",
    "\n",
    "        self.W_constraint = constraints.get(W_constraint)\n",
    "        self.b_constraint = constraints.get(b_constraint)\n",
    "\n",
    "        self.bias = bias\n",
    "        self.step_dim = step_dim\n",
    "        self.features_dim = 0\n",
    "        super(Attention, self).__init__(**kwargs)\n",
    "\n",
    "    def build(self, input_shape):\n",
    "        assert len(input_shape) == 3\n",
    "\n",
    "        self.W = self.add_weight(shape=(input_shape[-1],),\n",
    "                                 initializer=self.init,\n",
    "                                 name='{}_W'.format(self.name),\n",
    "                                 regularizer=self.W_regularizer,\n",
    "                                 constraint=self.W_constraint)\n",
    "        self.features_dim = input_shape[-1]\n",
    "\n",
    "        if self.bias:\n",
    "            self.b = self.add_weight(shape=(input_shape[1],),\n",
    "                                     initializer='zero',\n",
    "                                     name='{}_b'.format(self.name),\n",
    "                                     regularizer=self.b_regularizer,\n",
    "                                     constraint=self.b_constraint)\n",
    "        else:\n",
    "            self.b = None\n",
    "\n",
    "        self.built = True\n",
    "\n",
    "    def compute_mask(self, input, input_mask=None):\n",
    "        return None\n",
    "\n",
    "    def call(self, x, mask=None):\n",
    "        features_dim = self.features_dim\n",
    "        step_dim = self.step_dim\n",
    "\n",
    "        eij = K.reshape(K.dot(K.reshape(x, (-1, features_dim)),\n",
    "                        K.reshape(self.W, (features_dim, 1))), (-1, step_dim))\n",
    "\n",
    "        if self.bias:\n",
    "            eij += self.b\n",
    "\n",
    "        eij = K.tanh(eij)\n",
    "\n",
    "        a = K.exp(eij)\n",
    "\n",
    "        if mask is not None:\n",
    "            a *= K.cast(mask, K.floatx())\n",
    "\n",
    "        a /= K.cast(K.sum(a, axis=1, keepdims=True) + K.epsilon(), K.floatx())\n",
    "\n",
    "        a = K.expand_dims(a)\n",
    "        weighted_input = x * a\n",
    "        return K.sum(weighted_input, axis=1)\n",
    "\n",
    "    def compute_output_shape(self, input_shape):\n",
    "        return input_shape[0], self.features_dim"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "embedding_len = len(corpus) + 1\n",
    "n_tag = len(targ.keys())\n",
    "embedding_size = 100"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "_uuid": "ed0bec01d5f74324d79d75e1890fa4819f1acc98"
   },
   "outputs": [],
   "source": [
    "x_train, x_test, y_train, y_test = train_test_split(text, label, test_size=0.2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((8000, 100), (8000, 100, 9))"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_train.shape, y_train.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((2000, 100), (2000, 100, 9))"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_test.shape, y_test.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "lstm_units = int(x_train.shape[1] * n_tag / 2)\n",
    "# lstm_units = 32"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "_uuid": "2fa113078dde42fb187ec5f7216e6a2f8717c622",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"model_1\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "input_1 (InputLayer)         (None, 100)               0         \n",
      "_________________________________________________________________\n",
      "embedding_1 (Embedding)      (None, 100, 100)          407100    \n",
      "_________________________________________________________________\n",
      "bidirectional_1 (Bidirection (None, 100, 900)          1983600   \n",
      "_________________________________________________________________\n",
      "attention_1 (Attention)      (None, 900)               1000      \n",
      "_________________________________________________________________\n",
      "reshape_1 (Reshape)          (None, 100, 9)            0         \n",
      "_________________________________________________________________\n",
      "activation_1 (Activation)    (None, 100, 9)            0         \n",
      "_________________________________________________________________\n",
      "crf_1 (CRF)                  (None, 100, 9)            189       \n",
      "=================================================================\n",
      "Total params: 2,391,889\n",
      "Trainable params: 2,391,889\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "inp = layers.Input(shape=(WORD_NUM, ))\n",
    "x = layers.Embedding(embedding_len, embedding_size, input_length=WORD_NUM)(inp)\n",
    "x = layers.Bidirectional(layers.LSTM(lstm_units, return_sequences=True))(x)\n",
    "\n",
    "x = Attention(WORD_NUM)(x)\n",
    "x = layers.Reshape((WORD_NUM, n_tag))(x)\n",
    "# x = layers.TimeDistributed(layers.Dense(n_tag, activation=\"relu\"))(x)\n",
    "x = layers.Activation('softmax')(x)\n",
    "x = CRF(n_tag, sparse_target=True)(x)\n",
    "\n",
    "model = Model(inputs=inp, outputs=x)\n",
    "\n",
    "# adam = keras.optimizers.Adam(lr=0.0005, beta_1=0.9, beta_2=0.999)\n",
    "model.compile(loss=crf_loss,\n",
    "              optimizer='adam',\n",
    "              metrics=[crf_accuracy])\n",
    "\n",
    "# model.compile(loss='categorical_crossentropy',\n",
    "#               optimizer=keras.optimizers.Adam(0.001),\n",
    "#               metrics=['accuracy'])\n",
    "\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "_uuid": "124306348431764ee32027ab77412f1b3abf05bd"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\anaconda3\\envs\\test\\lib\\site-packages\\tensorflow\\python\\framework\\indexed_slices.py:434: UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown shape. This may consume a large amount of memory.\n",
      "  \"Converting sparse IndexedSlices to a dense Tensor of unknown shape. \"\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 8000 samples, validate on 2000 samples\n",
      "Epoch 1/10\n",
      "8000/8000 [==============================] - 23s 3ms/step - loss: 1.4387 - crf_accuracy: 0.9995 - val_loss: 1.3143 - val_crf_accuracy: 0.9994\n",
      "Epoch 2/10\n",
      "8000/8000 [==============================] - 22s 3ms/step - loss: 1.2626 - crf_accuracy: 0.9995 - val_loss: 1.2131 - val_crf_accuracy: 0.9994\n",
      "Epoch 3/10\n",
      "8000/8000 [==============================] - 23s 3ms/step - loss: 1.1723 - crf_accuracy: 0.9995 - val_loss: 1.1283 - val_crf_accuracy: 0.9994\n",
      "Epoch 4/10\n",
      "8000/8000 [==============================] - 23s 3ms/step - loss: 1.0896 - crf_accuracy: 0.9995 - val_loss: 1.0475 - val_crf_accuracy: 0.9994\n",
      "Epoch 5/10\n",
      "8000/8000 [==============================] - 23s 3ms/step - loss: 1.0099 - crf_accuracy: 0.9995 - val_loss: 0.9687 - val_crf_accuracy: 0.9994\n",
      "Epoch 6/10\n",
      "8000/8000 [==============================] - 23s 3ms/step - loss: 0.9320 - crf_accuracy: 0.9995 - val_loss: 0.8926 - val_crf_accuracy: 0.9994\n",
      "Epoch 7/10\n",
      "8000/8000 [==============================] - 23s 3ms/step - loss: 0.8576 - crf_accuracy: 0.9995 - val_loss: 0.8199 - val_crf_accuracy: 0.9994\n",
      "Epoch 8/10\n",
      "8000/8000 [==============================] - 23s 3ms/step - loss: 0.7865 - crf_accuracy: 0.9995 - val_loss: 0.7505 - val_crf_accuracy: 0.9994\n",
      "Epoch 9/10\n",
      "8000/8000 [==============================] - 23s 3ms/step - loss: 0.7188 - crf_accuracy: 0.9995 - val_loss: 0.6847 - val_crf_accuracy: 0.9994\n",
      "Epoch 10/10\n",
      "8000/8000 [==============================] - 23s 3ms/step - loss: 0.6548 - crf_accuracy: 0.9995 - val_loss: 0.6230 - val_crf_accuracy: 0.9994\n"
     ]
    }
   ],
   "source": [
    "history = model.fit(x_train, y_train, batch_size=256, epochs=5, validation_data=(x_test, y_test))\n",
    "# history = model.fit(text, label, batch_size=256, epochs=5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x22a38eb8748>"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 800x640 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10, 8), dpi=80)\n",
    "plt.plot(history.history['loss'], label='loss')\n",
    "plt.plot(history.history['val_loss'], label='val_loss')\n",
    "plt.title('Loss')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Acc')"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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CRwOvFud5yVJkqTs2pGpBV8HhkXE1VR0RIcCRMTdwIiU0gigOfBSRJRTEZJvSSk9Vukcz+Ru3GoA3AfcWmnsDxHRBWhIxdSCq6tZ1w+BeyPim7n3f5lSemsHnpckSZIyqFpTC/ZETi2QJEmq3XbJ1AJJkiSptjHISpIkKZMMspIkScokg6wkSZIyySArSZKkTDLISpIkKZMMspIkScokg6wkSZIyySArSZKkTDLISpIkKZMMspIkScokg6wkSZIyySArSZKkTDLISpIkKZMMspIkScokg6wkSZIyySArSZKkTDLISpIkKZMMspIkScokg6wkSZIyySArSZKkTDLISpIkKZMMspIkScokg6wkSZIyySArSZKkTDLISpIkKZMMspIkScokg6wkSZIyySArSZKkTDLISpIkKZMMspIkScokg6wkSZIyySArSZKkTDLISpIkKZMMspIkScokg6wkSZIyySArSZKkTDLISpIkKZMMspIkScokg6wkSZIyySArSZKkTDLISpIkKZMMspIkScokg6wkSZIyySArSZKkTDLISpIkKZMMspIkScokg6wkSZIyySArSZKkTDLISpIkKZMMspIkScokg6wkSZIyySArSZKkTDLISpIkKZMMspIkScokg6wkSZIyySArSZKkTDLISpIkKZMMspIkScqkagfZiOgZEa9FxNSIGB0RfbdxTEFE3BQREyJickTcExENKo1/Pzc2KSIejYgWlcYuiIjxufHnI6LzNs4/NCJSRAzZxtgJEVEWEd+t7nOSJElSdu1IR/YO4M6UUi/gl8CwbRxzITAg93YAUA58ByAiTgaGAkemlPoAY4Gf5cZ6A78CTk0p9QPuBW6vfOKI6ApcDLyx9UUjojnwC+DJHXg+kiRJyrBqBdmIaAMMBO7PfegRoFNE9Njq0IOB51JKJSmlBDwFXFBpbFRKaU3u/ScrjfUD3k0pLag0dlpEtMpdvwC4G/gWsGkbJd4K3AAsq87zkSRJUvZVtyPbCViQUioFyIXUOcDWL/+PBc6IiGYRUR84B+haaeykiGgXEQGcBzSNiJbAeGBARPTKHXs+EECX3PtXAK+mlMZuXVhEfB4oTymNqOZzkSRJ0h6gcBefbxgV4fNlYAPwHHAKQErpxYi4CXgcKAMezT2mNKU0LSIuBf4UEYXAE8BKoDQi+gFnAcdufbGIaAdc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\n",
      "text/plain": [
       "<Figure size 800x640 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10, 8), dpi=80)\n",
    "plt.plot(history.history['crf_accuracy'], label='train')\n",
    "plt.plot(history.history['val_crf_accuracy'], label='val')\n",
    "plt.legend()\n",
    "plt.title('Acc')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "_uuid": "d69d4e8d2a544352418b1fc7144c6162d05823c5"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2000/2000 [==============================] - 7s 4ms/step\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[0.6230074944496155, 0.9993895888328552]"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.evaluate(x_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([10, 11, 12, 13, 14, 15, 14, 16, 57, 17, 58, 59, 60, 27, 27, 61, 62,\n",
       "       63, 29, 37, 64, 26, 65, 66, 67, 68, 17, 69,  5, 65, 65, 70, 29, 44,\n",
       "       71, 30, 31, 72, 38, 73, 74, 16, 75, 76, 77, 78, 79, 80, 61, 62, 37,\n",
       "       64, 26, 67, 66, 60, 68, 17, 69,  5, 65, 65, 67, 29, 44, 71, 30, 31,\n",
       "       72, 38, 73, 74, 81, 76, 82, 83, 37, 38, 28, 84, 66, 28, 68, 56,  0,\n",
       "        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0])"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "text[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [],
   "source": [
    "pre = model.predict(text[1].reshape(-1, WORD_NUM))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "        [1., 0., 0., 0., 0., 0., 0., 0., 0.]]], dtype=float32)"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pre"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=int64)"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.argmax(pre, axis=-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([7, 8, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 3, 6, 7, 7, 7,\n",
       "       7, 7, 7, 7, 7, 7, 3, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 0, 4, 4,\n",
       "       7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 3, 6, 6, 6, 6, 7, 7,\n",
       "       7, 7, 7, 7, 7, 7, 5, 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n",
       "       7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7], dtype=int64)"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.argmax(label[1], axis=-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'B_ORG': 0,\n",
       " 'I_PER': 1,\n",
       " 'I_LOC': 2,\n",
       " 'B_T': 3,\n",
       " 'I_ORG': 4,\n",
       " 'B_PER': 5,\n",
       " 'I_T': 6,\n",
       " 'O': 7,\n",
       " 'B_LOC': 8}"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "targ"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'0=0': 1.0}]"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dv.inverse_transform(pre[0][0].reshape(1, -1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "_uuid": "65cc696bccec82077d699e41c42113cc532cfb03"
   },
   "outputs": [],
   "source": [
    "# class NERInference:\n",
    "#     def __init__(self, model, words, word2idx, tags, n_words, maxlen, split_pattern=\"(,|!|\\.| +)\"):\n",
    "#         self.model = model\n",
    "#         self.words = words\n",
    "#         self.word2idx = word2idx\n",
    "#         self.tags = tags\n",
    "#         self.n_words = n_words\n",
    "#         self.pattern = split_pattern\n",
    "#         self.maxlen = maxlen\n",
    "        \n",
    "#     def predict(self, string):\n",
    "#         preds = []\n",
    "#         tokens = [[self.word2idx[word] for word in string if word in self.words]]\n",
    "#         padded = pad_sequences(tokens, maxlen=self.maxlen, padding='post', value=self.n_words-1)\n",
    "#         pred_ner = np.argmax(self.model.predict(padded), axis=-1)\n",
    "#         for w,pred in zip(padded[0], pred_ner[0]):\n",
    "#             if w == self.n_words - 1:\n",
    "#                 break\n",
    "#             #print(\"{:15}: {}\".format(self.words[w], self.tags[pred]))\n",
    "#             preds.append(self.tags[pred])\n",
    "#         return preds\n",
    "\n",
    "# myNerInfer = NERInference(model, word2idx=word2idx, words=words, tags=tags, n_words=n_words, maxlen=maxlen)\n",
    "\n",
    "# new_string4 = '王小明出生在北京'\n",
    "# new_string4_pred = myNerInfer.predict(string=new_string4)\n",
    "# new_string4_pred\n",
    "\n",
    "# class FindNamedEntites(object):\n",
    "#     new_string_pred = []\n",
    "#     new_string = ''\n",
    "    \n",
    "#     def __init__(self, new_string):\n",
    "#         self.new_string = new_string\n",
    "        \n",
    "#     def make_preds(self):\n",
    "#         self.new_string_pred = myNerInfer.predict(string=self.new_string)\n",
    "#     def find_person(self, new_string):\n",
    "#         if len(self.new_string_pred)==0:\n",
    "#             self.new_string_pred = myNerInfer.predict(string=new_string)\n",
    "#         persons = []\n",
    "#         person = ''\n",
    "#         for w, t in zip(new_string, self.new_string_pred):\n",
    "#             if t == 'B-PER' or t == 'I-PER':\n",
    "#                 person+=w\n",
    "#             else:\n",
    "#                 if person!='': persons.append(person)\n",
    "#                 person=''\n",
    "#         return persons\n",
    "#     def find_org(self, new_string):\n",
    "#         if len(self.new_string_pred)==0:\n",
    "#             self.new_string_pred = myNerInfer.predict(string=new_string)\n",
    "#         persons = []\n",
    "#         person = ''\n",
    "#         for w, t in zip(new_string, self.new_string_pred):\n",
    "#             if t == 'B-ORG' or t == 'I-ORG':\n",
    "#                 person+=w\n",
    "#             else:\n",
    "#                 if person!='': persons.append(person)\n",
    "#                 person=''\n",
    "#         return persons\n",
    "#     def find_loc(self, new_string):\n",
    "#         if len(self.new_string_pred)==0:\n",
    "#             self.new_string_pred = myNerInfer.predict(string=new_string)\n",
    "#         if new_string:\n",
    "#             self.new_string_pred = myNerInfer.predict(string=new_string)\n",
    "#         persons = []\n",
    "#         person = ''\n",
    "#         for w, t in zip(new_string, self.new_string_pred):\n",
    "#             if t == 'B-LOC' or t == 'I-LOC':\n",
    "#                 person+=w\n",
    "#             else:\n",
    "#                 if person!='': persons.append(person)\n",
    "#                 person=''\n",
    "#         return persons\n",
    "\n",
    "#     def find_ner(self):\n",
    "#         persons = self.find_person(self.new_string)\n",
    "#         orgs = self.find_org(self.new_string)\n",
    "#         locs = self.find_loc(self.new_string)\n",
    "#         print(\"{:12} : \".format('PERSON'), persons)\n",
    "#         print(\"{:12} : \".format('ORGNIZATION'), orgs)\n",
    "#         print(\"{:12} : \".format('LOCATION'), locs)\n",
    "\n",
    "# ner_recog = FindNamedEntites('王硕出生在广州，他现在在中国大使馆纽约办事处工作。他说下次回国的时候要去黄山旅游，他不喜欢跟着广州市教育局去，想要自驾游')\n",
    "# ner_recog.make_preds()\n",
    "# ner_recog.find_ner()\n",
    "\n",
    "# print(ner_recog.find_loc('从广州到北京的交通路线'))\n",
    "# print(ner_recog.find_loc('怎么样从北京去到广州呢？'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "_uuid": "ef881bb13b0dba32d5512df837b6322fe5d9ca99"
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
